package com.bdqn.design.singleton;

/**
 * Singleton03 [懒汉式]单例模式，整个程序中只有一个对象
 *
 * @author LILIBO
 * @since 2025/1/8
 */
public class Singleton03 {

    /**
     * 静态变量，该类的唯一实例
     */
    private static Singleton03 singleton;

    private String message;

    /**
     * 私有化构造器
     */
    private Singleton03() {
        this.message = "100G ...";
        try {
            System.out.println("3秒");
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 提供一个静态方法，返回该类的唯一实例（双检锁机制）
     *
     * @return
     */
    public static Singleton03 getInstance() {
        if (singleton == null) {
            // 在判断里面写同步代码块（保障性能）
            synchronized (Singleton03.class) {
                // 双重检查
                if (singleton == null) { // 再次检查对象（保障线程安全）
                    singleton = new Singleton03();
                }
            }
        }
        return singleton;
    }

    // 模拟序号
    private int index = 0;

    /**
     * 获取下一个序号
     *
     * @return
     */
    public synchronized int next() {
        return ++index;
    }

}
